/* --- 使用注解 ---

------------------------------------

本节我们将介绍Java程序的一种特殊“注释”——注解（Annotation）。

Q：什么是注解（Annotation）？
A：注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”：  */
@Resource("hello")
public class Hello {
	@Inject //注入/投入
	int n;

	@PostConstruct //岗位/功能 构造
	public void hello(@Param String name) {
		System.our.println(name);
	}

	@Override //覆写
	public String toString() {
		return "Hello";
	}
}

/*
注释会被‘编译器’直接忽略
注解可以被编译器打包进入class文件,
因此,注解是一种用作标注的“元数据”。
*/

/* -----------------------------------------

# 注解的作用 # 

Java的注解可以分为三类：

第1类：
是由【编译器使用的注解】，例如：
	@Override(覆写)
	：让编译器检查该方法是否正确地实现了覆写；

	@SuppressWarnings(抑制警告)
	：告诉编译器忽略此处代码产生的警告。

这类注解不会被编译进入.class文件，它们在编译后就被编译器扔掉了。




第2类
是由【工具处理【.class文件】使用的注解】。

比如有些工具会在加载class的时候，对class做动态修改，实现一些特殊的功能。这类注解会被编译进入.class文件，但加载结束后并不会存在于内存中。这类注解只被一些底层库使用，一般我们不必自己处理。





第3类
是在【程序运行期能够读取的注解】。
它们在加载后一直存在于JVM中，这也是最常用的注解。

例如，一个配置了@PostConstruct的方法会在调用‘构造方法’后【自动被调用】（这是Java代码读取该注解实现的功能，JVM并不会识别该注解）。



定义一个注解时，还可以定义配置参数。配置参数可以包括：
	1.所有基本类型；
	2.String；
	3.枚举类型；
	4.基本类型、String以及枚举的数组。


因为配置参数必须是常量，所以，上述限制保证了注解在定义时就已经确定了每个参数的值。

‘注解’的【配置参数】可以有‘默认值’，缺少某个配置参数时将使用默认值。

此外，大部分注解会有一个名为value的配置参数，对此参数赋值，可以只写常量，相当于省略了value参数。

如果只写注解，相当于全部使用默认值。



举个栗子，对以下代码：   */
public class Hello {
	@Check(min=0, max=100, value=55)
	public int n;

	@Check(value=99)
	public int p;

	@Check(99) //@Check(value=99)
	public int x;

	@Check
	public int y;
}

/*
@Check就是一个注解。

第一个@Check(min=0, max=100, value=55)
明确定义了三个参数，

第二个@Check(value=99)只定义了一个value参数，
它实际上和@Check(99)是完全一样的。

最后一个@Check表示所有参数都使用默认值。

*/



/* --- 使用注解 の 小结 ---

1.注解（Annotation）是Java语言用于工具处理的标注：

2.注解可以配置参数，没有指定配置的参数使用默认值；

3.如果参数名称是value，且只有一个参数，那么可以省略参数名称。

*/












